package br.com.foxinline.servico;

import br.com.foxinline.modelo.Selo;
import br.com.foxinline.modelo.TipoSelo;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.Query;

/**
 *
 * @author cadomeireles
 */
@Stateless
public class SeloServico extends ServicoGenerico<Selo> {

    public SeloServico() {
        super(Selo.class);
    }

    public List<Selo> pesquisar(Selo selo) {
        String sql = "select selo from Selo selo where selo.id is not null";

        if (selo.getTipoSelo() != null) {
            sql += " and selo.tipoSelo = :tipoSelo";
        }

        if (selo.getNumero() != null) {
            sql += " and selo.numero = " + selo.getNumero();
        }

        if (selo.getSerie() != null && !selo.getSerie().isEmpty()) {
            sql += " and selo.serie like '" + selo.getSerie() + "'";
        }
        
        Query query = getEntityManager().createQuery(sql);

        if (selo.getTipoSelo() != null) {
            query.setParameter("tipoSelo", selo.getTipoSelo());
        }

        return query.getResultList();
    }
    
    public Selo obterSelo(Selo selo) {

        String sql = "select selo from Selo selo where selo.ativo = true";
        
        sql += " and selo.tipoSelo = :tipoSelo";
        
        sql += " and selo.numero = " + selo.getNumero();
        
        sql += " and selo.serie like '" + selo.getSerie() + "'";
        
        Query query = getEntityManager().createQuery(sql);
        
        query.setParameter("tipoSelo", selo.getTipoSelo());
        
        return (Selo) query.getSingleResult();

    }

    public Integer quantidadePorTipo(TipoSelo tipoSelo) {
        String sql = "select count(selo) from Selo selo";

        if (tipoSelo.getId() != null) {
            sql += " where selo.tipoSelo = :tipoSelo and selo.distribuido = false";
        }

        Query query = getEntityManager().createQuery(sql);

        if (tipoSelo != null && tipoSelo.getId() != null) {
            query.setParameter("tipoSelo", tipoSelo);
        }
               
        return Integer.parseInt(query.getSingleResult().toString());
    }

    public List<Selo> obterSelos(TipoSelo tipoSelo, Integer quantidade, Boolean distribuido) {
        String sql = "select selo from Selo selo";

        if (tipoSelo.getId() != null) {
            sql += " where selo.tipoSelo = :tipoSelo and selo.distribuido = :distribuido order by selo.id";
        }
        
        Query query = getEntityManager().createQuery(sql);

        if (tipoSelo != null && tipoSelo.getId() != null) {
            query.setParameter("tipoSelo", tipoSelo);
        }

        if (distribuido != null) {
            query.setParameter("distribuido", distribuido);
        }        

        return query.setMaxResults(quantidade).getResultList();
    }

    public void distribuicao(List<Selo> selos, Boolean distribuir) {
        String sql = "update Selo set distribuido = :distribuir";
        
        StringBuilder ids = new StringBuilder();
        
        for (int i = 0; i < selos.size(); i++) {
            ids.append(selos.get(i).getId());
            if (i != selos.size() - 1) {
                ids.append(", ");
            }
        }

        sql += " where id in (" + ids + ")";

        Query query = getEntityManager().createQuery(sql);

        if (distribuir != null) {
            query.setParameter("distribuir", distribuir);
        }        

        query.executeUpdate();
    }

}
